package main

import "fmt"

/*
  1.Slice(切片)
  arr := [...]int{0, 1，2，3，4，5，6，7}
  s := arr[2:6]
  (1) s的值为[2 3 4 5]
  Slice不是值类型，go语言所有类型都是值类型，但是Slice肚子里面是有一个数据结构的
  文档说Slice是对arr的一个view,即arr[:]是arr的视图

  2.Slice
  arr := [...]int{0, 1，2，3，4，5，6，7}
  s := arr[2:6]
  s[0] = 10
  (1) Slice本身没有数据，是对底层array的一个view
  (2) arr的值变为[0 1 10 3 4 5 6 7]


  3.Slice的Reslice用法
  s = arr[2:6]
  s = s[:3]
  s = s[1:]
  s = arr[:]

  4.Slice的扩展
  arr := [...] int{0, 1，2，3，4, 5, 6，7}
  s1 := arr[2:6]
  s2 := s1[3:5]
  s1的值为?
  s2的值为?
  (1) s1的值为[2 3 4 5]，s2的值为[5 6]
  (3) slice可以向后扩展，不可以向前扩展
  (3) s[i不可以超越len(s)，向后扩展不可以超越底层数组cap(s)




*/
func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}

	fmt.Println("arr[2:6] =", arr[2:6])
	fmt.Println("arr[:6] =", arr[:6])
	s1 := arr[2:]
	fmt.Println("s1 =", s1)
	s2 := arr[:]
	fmt.Println("s2 =", s2)

	fmt.Println("After updateSlice(s1)")
	updateSlice(s1)
	fmt.Println(s1)
	fmt.Println(arr)

	fmt.Println("After updateSlice(s2)")
	updateSlice(s2)
	fmt.Println(s2)
	fmt.Println(arr)

	fmt.Println("Reslice")
	fmt.Println(s2)
	s2 = s2[:5]
	fmt.Println(s2)
	s2 = s2[2:]
	fmt.Println(s2)

	fmt.Println("Extending slice")
	arr[0], arr[2] = 0, 2
	fmt.Println("arr =", arr)
	s1 = arr[2:6]
	s2 = s1[3:5] // [s1[3], s1[4]]
	//fmt.Println("s1=", s1)
	//fmt.Println("s2=", s2)
	fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))
	fmt.Println(s1[3:6])

}

func updateSlice(s []int) { // s []int不加长度就是Slice
	s[0] = 100
}
